home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xsw / ps.c < prev    next >
C/C++ Source or Header  |  1995-07-07  |  31KB  |  1,022 lines

  1. /*
  2.  *    @(#) ps.c 12.1 95/07/07 SCOINC
  3.  */
  4. /***************************************************************************
  5.  *
  6.  *    Copyright (c) 1990-1993        The Santa Cruz Operation, Inc.
  7.  *
  8.  *    All rights reserved.  No part of this program or publication may be
  9.  *    reproduced, transmitted, transcribed, stored in a retrieval system,
  10.  *    or translated into any language or computer language, in any form or
  11.  *    by any means, electronic, mechanical, magnetic, optical, chemical,
  12.  *    biological, or otherwise, without the prior written permission of:
  13.  *
  14.  *        The Santa Cruz Operation , Inc.        (408) 425-7222
  15.  *        400 Encinal St., Santa Cruz, California 95060 USA
  16.  *
  17.  **************************************************************************/
  18. /*
  19.  * Modification History
  20.  *
  21.  * S003, 15-Sep-93, rickra
  22.  *    Oh OH, added disk space code ..... 
  23.  *
  24.  * S002, 27-May-93, rickra
  25.  *     Put all "PS" specific stuff here... That is, code that PS MEM,
  26.  *    PS I/O, and PS CPU share, in this file......
  27.  *
  28.  * S001, 01-Jan-93, rickra
  29.  *     Added support for seperate windows.
  30.  *    Took out PSIO PSMEM PSCPU specific code and made new files with it.
  31.  *
  32.  * S000, 30-Sep-92, rickra
  33.  *     Added copyright and modification history
  34.  *    Change hard coded color referneces to user configurable.
  35.  */
  36. /*+-------------------------------------------------------------------------
  37.     ps.c - XSW proc status detail
  38.  
  39.   Defined functions:
  40.     find_utmp_for_pgrp(pgrp)
  41.     get_cpu_time_str(ticks)
  42.     get_user(tproc,tuser)
  43.     getpwent_and_enter(uid)
  44.     init_uid_name_hash()
  45.     initialize_Ps()
  46.     pgrp_to_ttyname(pgrp)
  47.     ppproc_pid_compare(ppp1,ppp2)
  48.     sort_procs(initial)
  49.     read_utmp()
  50.     uid_name_enter(uid,name)
  51.  
  52. --------------------------------------------------------------------------*/
  53. /*+:EDITS:*/
  54.  
  55.  
  56. #include <X11/Xlib.h>
  57. #include <X11/Xutil.h>
  58. #include <X11/Intrinsic.h>
  59. #include <X11/Shell.h>
  60. #include <X11/StringDefs.h>
  61. #include <Xm/Xm.h>
  62. #include <Xm/MainW.h>
  63. #include <Xm/DrawingA.h>
  64.  
  65. #include "include/unixincs.h"
  66. #include "include/resources.h"
  67. #include "include/xswboth.h"
  68. #include "include/buttons.h"
  69. #include "include/libkmem.h"
  70. #include "include/libmem.h"
  71. #include "include/libswap.h"
  72. #include "include/xsw.h"
  73. #include "include/sepwin.h"
  74.  
  75. extern struct NetworkXswStruct *current_server;
  76.  
  77. extern MyResources res;
  78.  
  79. static int      max_procs_to_display = 0;
  80.  
  81. /*
  82.  * The following are used in both pscpu.c and psio.c, thus  the variables
  83.  * are defined here....
  84.  */
  85.  
  86.  
  87. /*
  88.  * These two are place holders and can be global?????
  89.  */
  90.  
  91. struct my_user_struct user;
  92. struct my_user_struct old_user;
  93.  
  94. static int      line_style = LineSolid;
  95. static int      cap_style = CapButt;
  96. static int      join_style = JoinMiter;
  97.  
  98. /*
  99.  * PS MEM external defined functions
  100.  */
  101.  
  102.  
  103.  
  104. extern          process_mem_user_compare (process_memory * ppp1, process_memory * ppp2);
  105. extern          process_mem_pid_compare (process_memory * ppp1, process_memory * ppp2);
  106. extern          process_mem_vsize_compare (process_memory * ppp1, process_memory * ppp2);
  107. extern          process_mem_shrd_compare (process_memory * ppp1, process_memory * ppp2);
  108. extern          process_mem_priv_compare (process_memory * ppp1, process_memory * ppp2);
  109. extern          process_mem_wtd_compare (process_memory * ppp1, process_memory * ppp2);
  110. extern          process_memory_compare (process_memory * ppp1, process_memory * ppp2);
  111. extern          process_mem_cmd_compare (process_memory * ppp1, process_memory * ppp2);
  112.  
  113.  
  114. extern          process_mem_none_compare (process_memory * ppp1, process_memory * ppp2);
  115. extern          process_mem_swap_compare (process_memory * ppp1, process_memory * ppp2);
  116. extern          process_mem_file_compare (process_memory * ppp1, process_memory * ppp2);
  117. extern          process_mem_lstfile_compare (process_memory * ppp1, process_memory * ppp2);
  118. extern          process_mem_zero_compare (process_memory * ppp1, process_memory * ppp2);
  119. extern          process_mem_fill_compare (process_memory * ppp1, process_memory * ppp2);
  120. extern          process_mem_iomap_compare (process_memory * ppp1, process_memory * ppp2);
  121. #ifndef XSW32v5
  122. extern          process_mem_window_compare (process_memory * ppp1, process_memory * ppp2);
  123. #endif
  124. extern          process_mem_swap_core_compare (process_memory * ppp1, process_memory * ppp2);
  125. extern          process_mem_file_core_compare (process_memory * ppp1, process_memory * ppp2);
  126. extern          process_mem_lstfile_core_compare (process_memory * ppp1, process_memory * ppp2);
  127. extern          process_mem_swap_not_core_compare (process_memory * ppp1, process_memory * ppp2);
  128. extern          process_mem_file_not_core_compare (process_memory * ppp1, process_memory * ppp2);
  129. extern          process_mem_lstfile_not_core_compare (process_memory * ppp1, process_memory * ppp2);
  130.  
  131. extern          process_mem_core_dbd_compare (process_memory * ppp1, process_memory * ppp2);
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138. /*
  139.  * PS IO external defined functions
  140.  */
  141.  
  142. extern          ppproc_io_user_compare (struct my_proc_struct **ppp1,
  143.                     struct my_proc_struct **ppp2);
  144. extern          ppproc_io_pid_compare (struct my_proc_struct **ppp1,
  145.                        struct my_proc_struct **ppp2);
  146. extern          ppproc_io_swap_compare (struct my_proc_struct **ppp1,
  147.                     struct my_proc_struct **ppp2);
  148. extern          ppproc_io_char_compare (struct my_proc_struct **ppp1,
  149.                     struct my_proc_struct **ppp2);
  150. extern          ppproc_io_read_compare (struct my_proc_struct **ppp1,
  151.                     struct my_proc_struct **ppp2);
  152. extern          ppproc_io_write_compare (struct my_proc_struct **ppp1,
  153.                      struct my_proc_struct **ppp2);
  154. extern          ppproc_io_total_compare (struct my_proc_struct **ppp1,
  155.                      struct my_proc_struct **ppp2);
  156. extern          ppproc_io_cmd_compare (struct my_proc_struct **ppp1,
  157.                        struct my_proc_struct **ppp2);
  158.  
  159. /*
  160.  * PS CPU external defined functions
  161.  */
  162.  
  163. extern          ppproc_state_compare (struct my_proc_struct **ppp1,
  164.                       struct my_proc_struct **ppp2);
  165. extern          ppproc_user_compare (struct my_proc_struct **ppp1,
  166.                      struct my_proc_struct **ppp2);
  167. extern          ppproc_pid_compare (struct my_proc_struct **ppp1,
  168.                     struct my_proc_struct **ppp2);
  169. extern          ppproc_cpu_compare (struct my_proc_struct **ppp1,
  170.                     struct my_proc_struct **ppp2);
  171. extern          ppproc_pri_compare (struct my_proc_struct **ppp1,
  172.                     struct my_proc_struct **ppp2);
  173. extern          ppproc_ni_compare (struct my_proc_struct **ppp1,
  174.                    struct my_proc_struct **ppp2);
  175. extern          ppproc_ucpu_compare (struct my_proc_struct **ppp1,
  176.                      struct my_proc_struct **ppp2);
  177. extern          ppproc_ucpu_scpu_compare (struct my_proc_struct **ppp1,
  178.                       struct my_proc_struct **ppp2);
  179. extern          ppproc_scpu_compare (struct my_proc_struct **ppp1,
  180.                      struct my_proc_struct **ppp2);
  181. extern          ppproc_size_compare (struct my_proc_struct **ppp1,
  182.                      struct my_proc_struct **ppp2);
  183. extern          ppproc_tty_compare (struct my_proc_struct **ppp1,
  184.                     struct my_proc_struct **ppp2);
  185. extern          ppproc_cmd_compare (struct my_proc_struct **ppp1,
  186.                     struct my_proc_struct **ppp2);
  187.  
  188.  
  189. void
  190. change_the_buttons (SP,
  191.             number_of_buttons,
  192.             seperate_window,
  193.             menulist,
  194.             temp_toggle_widget)
  195.  
  196.      struct NetworkXswStruct *SP;
  197.      int             number_of_buttons;
  198.      int             seperate_window;
  199.      ps_menu_struct *menulist;
  200.      Widget         *temp_toggle_widget;
  201.  
  202. {
  203.   Arg             args[32];
  204.   int             argcount;
  205.   int             j = 0;
  206.   int             value;
  207.   int             slider_size;
  208.   int             increment_return;
  209.   int             page_increment_return;
  210.   int             i = 0;
  211.  
  212.   XFontStruct    *Current_Font;
  213.   XmFontList      Font_List;
  214.  
  215. /*
  216.   fprintf (stdout, "In change_the_buttons\n");
  217. */
  218.  
  219.  
  220.   XmScrollBarGetValues (SP -> SEPERATE_WINDOWS_LIST[seperate_window].hsb,
  221.             &value,
  222.             &slider_size,
  223.             &increment_return,
  224.             &page_increment_return);
  225.  
  226.  
  227.   Current_Font = XLoadQueryFont (display, SP -> font_name);
  228.   Font_List = XmFontListCreate (Current_Font, XmSTRING_DEFAULT_CHARSET);
  229.  
  230.  
  231. /*
  232.  * Adjust the menu button.....
  233.  */
  234.  
  235.  
  236.   if (SP -> SEPERATE_WINDOWS_LIST[seperate_window].menu_bar != 0)
  237.     {
  238.  
  239.       argcount = 0;
  240.       XtSetArg (args[argcount], XmNfontList, Font_List);
  241.       argcount++;
  242.       XtSetValues (SP ->
  243.            SEPERATE_WINDOWS_LIST[seperate_window].view_toggle_widget,
  244.            args, argcount);
  245.  
  246.  
  247.       argcount = 0;
  248.       XtSetArg (args[argcount], XmNrightAttachment, XmATTACH_FORM);
  249.       argcount++;
  250.       XtSetArg (args[argcount], XmNrightOffset,
  251.         9 * FWIDTH);
  252.       argcount++;
  253.       XtSetArg (args[argcount], XmNmarginHeight, 0);
  254.       argcount++;
  255.       XtSetArg (args[argcount], XmNmarginWidth, 0);
  256.       argcount++;
  257.       XtSetArg (args[argcount], XmNshadowThickness, 1);
  258.       argcount++;
  259.  
  260.       XtSetValues (SP ->
  261.            SEPERATE_WINDOWS_LIST[seperate_window].menu_bar,
  262.            args, argcount);
  263.  
  264. /*
  265.  * Also need to adjust the menu list itself.... not just the button....
  266.  */
  267.  
  268.       for (i = 0; i < 4; i++)
  269.     {
  270.  
  271.       argcount = 0;
  272.       XtSetArg (args[argcount], XmNfontList, Font_List);
  273.       argcount++;
  274.       XtSetValues (SP ->
  275.            SEPERATE_WINDOWS_LIST[seperate_window].screen_widget_list[i],
  276.                args, argcount);
  277.  
  278.  
  279.  
  280.     }
  281.  
  282.  
  283.  
  284.  
  285.     }
  286.  
  287.  
  288.   for (j = 0; j < number_of_buttons; j++)
  289.     {
  290.  
  291.       if (menulist[j].type == SORT_BUTTON)
  292.     {
  293.       argcount = 0;
  294.       XtSetArg (args[argcount], XmNfontList, Font_List);
  295.       argcount++;
  296.       XtSetArg (args[argcount], XmNmarginBottom, 0);
  297.       argcount++;
  298.       XtSetArg (args[argcount], XmNmarginTop, 0);
  299.       argcount++;
  300.       XtSetArg (args[argcount], XmNleftAttachment, XmATTACH_FORM);
  301.       argcount++;
  302.  
  303.       XtSetArg (args[argcount], XmNleftOffset,
  304.             ((4 + (menulist[j].offset * FWIDTH) - value)));
  305.       argcount++;
  306.       XtSetValues (temp_toggle_widget[j], args, argcount);
  307.  
  308.     }
  309.       else
  310.     {
  311.       argcount = 0;
  312.       XtSetArg (args[argcount], XmNfontList, Font_List);
  313.       argcount++;
  314.       XtSetArg (args[argcount], XmNmarginBottom, 0);
  315.       argcount++;
  316.       XtSetArg (args[argcount], XmNmarginTop, 0);
  317.       argcount++;
  318.       XtSetArg (args[argcount], XmNrightAttachment, XmATTACH_FORM);
  319.       argcount++;
  320.       XtSetArg (args[argcount], XmNrightOffset,
  321.             ((4 + (menulist[j].offset * FWIDTH))));
  322.       argcount++;
  323.       XtSetValues (temp_toggle_widget[j], args, argcount);
  324.  
  325.     }
  326.     }
  327. }
  328.  
  329. adjust_ps_button_offsets (SP)
  330.      struct NetworkXswStruct *SP;
  331. {
  332.  
  333.   int             i, j;
  334.  
  335.   Arg             args[32];
  336.   int             argcount;
  337.   int             number_of_buttons = 0;
  338.   int             seperate_window = 0;
  339.   Dimension       t1, t2, t3, t4, t5, t6;
  340.   ps_menu_struct *menulist;
  341.  
  342.   Widget         *temp_toggle_widget;
  343.  
  344.  
  345.  
  346.   XFontStruct    *Current_Font;
  347.   XmFontList      Font_List;
  348.  
  349. /*
  350.   fprintf (stdout, "In adjust ps buttons\n");
  351. */
  352.  
  353.   Current_Font = XLoadQueryFont (display, SP -> font_name);
  354.   Font_List = XmFontListCreate (Current_Font, XmSTRING_DEFAULT_CHARSET);
  355.  
  356.   for (i = 0; i < SP -> current_items; i++)
  357.     {
  358.  
  359.       if ((SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_cpu) ||
  360.       (SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_io) ||
  361.       (SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_mem) ||
  362.       (SP -> DISPLAY_LIST[i].button_num == BUTTON_disk_space))
  363.     {
  364.  
  365.       argcount = 0;
  366.       XtSetArg (args[argcount], XmNfontList, Font_List);
  367.       argcount++;
  368.       XtSetArg (args[argcount], XmNmarginBottom, 0);
  369.       argcount++;
  370.       XtSetArg (args[argcount], XmNmarginTop, 0);
  371.       argcount++;
  372.       XtSetValues (SP -> SEPERATE_WINDOWS_LIST[
  373.                   SP -> DISPLAY_LIST[i].button_num].title_label,
  374.                args,
  375.                argcount);
  376.  
  377.  
  378.       argcount = 0;
  379.       XtSetArg (args[argcount], XmNpaneMinimum, (FHEIGHT * 3));
  380.       argcount++;
  381.       XtSetArg (args[argcount], XmNpaneMaximum, (FHEIGHT * 3));
  382.       argcount++;
  383.       XtSetValues (SP -> SEPERATE_WINDOWS_LIST[
  384.                    SP -> DISPLAY_LIST[i].button_num].form_w,
  385.                args,
  386.                argcount);
  387.  
  388.  
  389.       if (SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_cpu)
  390.         {
  391.           number_of_buttons = XtNumber (ps_toggle_button_data);
  392.           seperate_window = BUTTON_ps_cpu;
  393.           menulist = ps_toggle_button_data;
  394.           temp_toggle_widget =
  395.         SP -> SEPERATE_WINDOWS_LIST[seperate_window].toggle_widget;
  396.           change_the_buttons (SP,
  397.                   number_of_buttons,
  398.                   seperate_window,
  399.                   menulist,
  400.                   temp_toggle_widget);
  401.  
  402.         }
  403.       else if (SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_io)
  404.         {
  405.           number_of_buttons = XtNumber (ps_io_toggle_button_data);
  406.           seperate_window = BUTTON_ps_io;
  407.           menulist = ps_io_toggle_button_data;
  408.           temp_toggle_widget =
  409.         SP -> SEPERATE_WINDOWS_LIST[seperate_window].toggle_widget;
  410.  
  411.           change_the_buttons (SP,
  412.                   number_of_buttons,
  413.                   seperate_window,
  414.                   menulist,
  415.                   temp_toggle_widget);
  416.  
  417.         }
  418.       else if (SP -> DISPLAY_LIST[i].button_num == BUTTON_ps_mem)
  419.         {
  420.  
  421.           number_of_buttons = XtNumber (ps_mem_toggle_button_data);
  422.           seperate_window = BUTTON_ps_mem;
  423.           menulist = ps_mem_toggle_button_data;
  424.           temp_toggle_widget =
  425.         SP -> SEPERATE_WINDOWS_LIST[seperate_window].toggle_widget;
  426.  
  427.           change_the_buttons (SP,
  428.                   number_of_buttons,
  429.                   seperate_window,
  430.                   menulist,
  431.                   temp_toggle_widget);
  432.  
  433.         }
  434.           else if (SP -> DISPLAY_LIST[i].button_num == BUTTON_disk_space)
  435.             {
  436.  
  437.               number_of_buttons = XtNumber (disk_space_toggle_button_data);
  438.               seperate_window = BUTTON_disk_space;
  439.               menulist = disk_space_toggle_button_data;
  440.               temp_toggle_widget =
  441.                 SP -> SEPERATE_WINDOWS_LIST[seperate_window].toggle_widget;
  442.  
  443.               change_the_buttons (SP,
  444.                                   number_of_buttons,
  445.                                   seperate_window,
  446.                                   menulist,
  447.                                   temp_toggle_widget);
  448.  
  449.             }
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.     }
  459.     }
  460.  
  461.  
  462. }
  463.  
  464.  
  465. void
  466. sort_processes (button_num)
  467.      int             button_num;
  468. {
  469.  
  470. /*
  471.   fprintf(stdout,"about to sort process\n");
  472. */
  473.  
  474.   switch (button_num)
  475.     {
  476.  
  477.     case BUTTON_ps_cpu:
  478.  
  479.       switch (current_server -> ps_sort_mode)
  480.     {
  481.  
  482.     case BUTTON_PS_state_sort - 25:
  483.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  484.             sizeof (struct my_proc_struct *), ppproc_state_compare);
  485.       break;
  486.  
  487.     case BUTTON_PS_user_sort - 25:
  488.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  489.              sizeof (struct my_proc_struct *), ppproc_user_compare);
  490.       break;
  491.  
  492.  
  493.     case BUTTON_PS_pid_sort - 25:
  494.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  495.               sizeof (struct my_proc_struct *), ppproc_pid_compare);
  496.       break;
  497.  
  498.     case BUTTON_PS_cpu_sort - 25:
  499.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  500.               sizeof (struct my_proc_struct *), ppproc_cpu_compare);
  501.       break;
  502.  
  503.     case BUTTON_PS_pri_sort - 25:
  504.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  505.               sizeof (struct my_proc_struct *), ppproc_pri_compare);
  506.       break;
  507.  
  508.     case BUTTON_PS_ni_sort - 25:
  509.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  510.             sizeof (struct my_proc_struct *), ppproc_ni_compare);
  511.       break;
  512.  
  513.     case BUTTON_PS_ucpu_sort - 25:
  514.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  515.              sizeof (struct my_proc_struct *), ppproc_ucpu_compare);
  516.       break;
  517.  
  518.     case BUTTON_PS_ucpu_scpu_sort - 25:
  519.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  520.         sizeof (struct my_proc_struct *), ppproc_ucpu_scpu_compare);
  521.       break;
  522.  
  523.     case BUTTON_PS_scpu_sort - 25:
  524.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  525.              sizeof (struct my_proc_struct *), ppproc_scpu_compare);
  526.       break;
  527.  
  528.     case BUTTON_PS_size_sort - 25:
  529.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  530.              sizeof (struct my_proc_struct *), ppproc_size_compare);
  531.       break;
  532.  
  533.     case BUTTON_PS_tty_sort - 25:
  534.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  535.               sizeof (struct my_proc_struct *), ppproc_tty_compare);
  536.       break;
  537.  
  538.     case BUTTON_PS_cmd_sort - 25:
  539.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  540.               sizeof (struct my_proc_struct *), ppproc_cmd_compare);
  541.       break;
  542.  
  543.  
  544.     }
  545.       break;
  546.  
  547.     case BUTTON_ps_io:
  548.  
  549.       switch (current_server -> ps_io_sort_mode)
  550.     {
  551.  
  552.     case BUTTON_IO_PS_user_sort - 40:
  553.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  554.           sizeof (struct my_proc_struct *), ppproc_io_user_compare);
  555.       break;
  556.  
  557.  
  558.     case BUTTON_IO_PS_pid_sort - 40:
  559.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  560.            sizeof (struct my_proc_struct *), ppproc_io_pid_compare);
  561.       break;
  562.  
  563.     case BUTTON_IO_PS_swap_sort - 40:
  564.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  565.           sizeof (struct my_proc_struct *), ppproc_io_swap_compare);
  566.       break;
  567.  
  568.     case BUTTON_IO_PS_char_sort - 40:
  569.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  570.           sizeof (struct my_proc_struct *), ppproc_io_char_compare);
  571.       break;
  572.  
  573.     case BUTTON_IO_PS_read_sort - 40:
  574.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  575.           sizeof (struct my_proc_struct *), ppproc_io_read_compare);
  576.       break;
  577.  
  578.     case BUTTON_IO_PS_write_sort - 40:
  579.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  580.          sizeof (struct my_proc_struct *), ppproc_io_write_compare);
  581.       break;
  582.  
  583.     case BUTTON_IO_PS_total_sort - 40:
  584.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  585.          sizeof (struct my_proc_struct *), ppproc_io_total_compare);
  586.       break;
  587.  
  588.     case BUTTON_IO_PS_cmd_sort - 40:
  589.       (void) qsort ((char *) current_server -> pprocs, (unsigned) current_server -> slots_in_use,
  590.            sizeof (struct my_proc_struct *), ppproc_io_cmd_compare);
  591.       break;
  592.  
  593.     }
  594.       break;
  595.     case BUTTON_ps_mem:
  596.  
  597.       switch (current_server -> ps_mem_screen_mode)
  598.     {
  599.  
  600.     case 1:
  601.  
  602.       switch (current_server -> ps_mem_sort_mode[0])
  603.         {
  604.         case BUTTON_MEM_PS_user_sort - 60:
  605.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  606.                 (unsigned) current_server -> current_mem_procs,
  607.                 sizeof (process_memory),
  608.                 process_mem_user_compare);
  609.           break;
  610.         case BUTTON_MEM_PS_pid_sort - 60:
  611.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  612.                 (unsigned) current_server -> current_mem_procs,
  613.                 sizeof (process_memory),
  614.                 process_mem_pid_compare);
  615.           break;
  616.         case BUTTON_MEM_PS_vsize_sort - 60:
  617.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  618.                 (unsigned) current_server -> current_mem_procs,
  619.                 sizeof (process_memory),
  620.                 process_mem_vsize_compare);
  621.           break;
  622.         case BUTTON_MEM_PS_shrd_sort - 60:
  623.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  624.                 (unsigned) current_server -> current_mem_procs,
  625.                 sizeof (process_memory),
  626.                 process_mem_shrd_compare);
  627.           break;
  628.         case BUTTON_MEM_PS_priv_sort - 60:
  629.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  630.                 (unsigned) current_server -> current_mem_procs,
  631.                 sizeof (process_memory),
  632.                 process_mem_priv_compare);
  633.           break;
  634.         case BUTTON_MEM_PS_wtd_sort - 60:
  635.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  636.                 (unsigned) current_server -> current_mem_procs,
  637.                 sizeof (process_memory),
  638.                 process_mem_wtd_compare);
  639.  
  640.           break;
  641.         case BUTTON_MEM_PS_total_sort - 60:
  642.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  643.                 (unsigned) current_server -> current_mem_procs,
  644.                 sizeof (process_memory),
  645.                 process_memory_compare);
  646.           break;
  647.         case BUTTON_MEM_PS_cmd_sort - 60:
  648.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  649.                 (unsigned) current_server -> current_mem_procs,
  650.                 sizeof (process_memory),
  651.                 process_mem_cmd_compare);
  652.  
  653.           break;
  654.  
  655.         }
  656.       break;
  657.     case 2:
  658.       switch (current_server -> ps_mem_sort_mode[1])
  659.         {
  660.         case 0:
  661.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  662.                 (unsigned) current_server -> current_mem_procs,
  663.                 sizeof (process_memory),
  664.                 process_mem_user_compare);
  665.           break;
  666.         case 1:
  667.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  668.                 (unsigned) current_server -> current_mem_procs,
  669.                 sizeof (process_memory),
  670.                 process_mem_pid_compare);
  671.           break;
  672.         case 2:
  673.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  674.                 (unsigned) current_server -> current_mem_procs,
  675.                 sizeof (process_memory),
  676.                 process_mem_vsize_compare);
  677.           break;
  678.         case 3:
  679.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  680.                 (unsigned) current_server -> current_mem_procs,
  681.                 sizeof (process_memory),
  682.                 process_mem_none_compare);
  683.           break;
  684.         case 4:
  685.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  686.                 (unsigned) current_server -> current_mem_procs,
  687.                 sizeof (process_memory),
  688.                 process_mem_swap_core_compare);
  689.           break;
  690.         case 5:
  691.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  692.                 (unsigned) current_server -> current_mem_procs,
  693.                 sizeof (process_memory),
  694.                 process_mem_file_core_compare);
  695.           break;
  696.         case 6:
  697.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  698.                 (unsigned) current_server -> current_mem_procs,
  699.                 sizeof (process_memory),
  700.                 process_mem_lstfile_core_compare);
  701.           break;
  702.         case 7:
  703.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  704.                 (unsigned) current_server -> current_mem_procs,
  705.                 sizeof (process_memory),
  706.                 process_mem_core_dbd_compare);
  707.           break;
  708.         case 8:
  709.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  710.                 (unsigned) current_server -> current_mem_procs,
  711.                 sizeof (process_memory),
  712.                 process_mem_cmd_compare);
  713.  
  714.           break;
  715.  
  716.         }
  717.  
  718.       break;
  719.     case 3:
  720.  
  721.       switch (current_server -> ps_mem_sort_mode[2])
  722.         {
  723.         case 0:
  724.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  725.                 (unsigned) current_server -> current_mem_procs,
  726.                 sizeof (process_memory),
  727.                 process_mem_user_compare);
  728.           break;
  729.         case 1:
  730.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  731.                 (unsigned) current_server -> current_mem_procs,
  732.                 sizeof (process_memory),
  733.                 process_mem_pid_compare);
  734.           break;
  735.         case 2:
  736.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  737.                 (unsigned) current_server -> current_mem_procs,
  738.                 sizeof (process_memory),
  739.                 process_mem_vsize_compare);
  740.           break;
  741.         case 3:
  742.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  743.                 (unsigned) current_server -> current_mem_procs,
  744.                 sizeof (process_memory),
  745.                 process_mem_none_compare);
  746.           break;
  747.         case 4:
  748.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  749.                 (unsigned) current_server -> current_mem_procs,
  750.                 sizeof (process_memory),
  751.                 process_mem_swap_compare);
  752.           break;
  753.         case 5:
  754.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  755.                 (unsigned) current_server -> current_mem_procs,
  756.                 sizeof (process_memory),
  757.                 process_mem_file_compare);
  758.           break;
  759.         case 6:
  760.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  761.                 (unsigned) current_server -> current_mem_procs,
  762.                 sizeof (process_memory),
  763.                 process_mem_lstfile_compare);
  764.           break;
  765.         case 7:
  766.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  767.                 (unsigned) current_server -> current_mem_procs,
  768.                 sizeof (process_memory),
  769.                 process_mem_zero_compare);
  770.           break;
  771.         case 8:
  772.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  773.                 (unsigned) current_server -> current_mem_procs,
  774.                 sizeof (process_memory),
  775.                 process_mem_fill_compare);
  776.           break;
  777.         case 9:
  778.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  779.                 (unsigned) current_server -> current_mem_procs,
  780.                 sizeof (process_memory),
  781.                 process_mem_iomap_compare);
  782.           break;
  783. #ifndef XSW32v5
  784.         case 10:
  785.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  786.                 (unsigned) current_server -> current_mem_procs,
  787.                 sizeof (process_memory),
  788.                 process_mem_window_compare);
  789.           break;
  790. #endif
  791.         case 11:
  792.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  793.                 (unsigned) current_server -> current_mem_procs,
  794.                 sizeof (process_memory),
  795.                 process_mem_cmd_compare);
  796.  
  797.           break;
  798.  
  799.  
  800.         }
  801.  
  802.  
  803.       break;
  804.     case 4:
  805.       switch (current_server -> ps_mem_sort_mode[3])
  806.         {
  807.         case 0:
  808.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  809.                 (unsigned) current_server -> current_mem_procs,
  810.                 sizeof (process_memory),
  811.                 process_mem_user_compare);
  812.           break;
  813.         case 1:
  814.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  815.                 (unsigned) current_server -> current_mem_procs,
  816.                 sizeof (process_memory),
  817.                 process_mem_pid_compare);
  818.           break;
  819.         case 2:
  820.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  821.                 (unsigned) current_server -> current_mem_procs,
  822.                 sizeof (process_memory),
  823.                 process_mem_vsize_compare);
  824.           break;
  825.         case 3:
  826.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  827.                 (unsigned) current_server -> current_mem_procs,
  828.                 sizeof (process_memory),
  829.                 process_mem_swap_not_core_compare);
  830.           break;
  831.         case 4:
  832.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  833.                 (unsigned) current_server -> current_mem_procs,
  834.                 sizeof (process_memory),
  835.                 process_mem_file_not_core_compare);
  836.           break;
  837.         case 5:
  838.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  839.                 (unsigned) current_server -> current_mem_procs,
  840.                 sizeof (process_memory),
  841.                 process_mem_lstfile_not_core_compare);
  842.           break;
  843.         case 6:
  844.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  845.                 (unsigned) current_server -> current_mem_procs,
  846.                 sizeof (process_memory),
  847.                 process_mem_zero_compare);
  848.           break;
  849.         case 7:
  850.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  851.                 (unsigned) current_server -> current_mem_procs,
  852.                 sizeof (process_memory),
  853.                 process_mem_fill_compare);
  854.           break;
  855.         case 8:
  856.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  857.                 (unsigned) current_server -> current_mem_procs,
  858.                 sizeof (process_memory),
  859.                 process_mem_iomap_compare);
  860.           break;
  861. #ifndef XSW32v5
  862.         case 9:
  863.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  864.                 (unsigned) current_server -> current_mem_procs,
  865.                 sizeof (process_memory),
  866.                 process_mem_window_compare);
  867.           break;
  868. #endif
  869.         case 10:
  870.           (void) qsort ((char *) current_server -> heap_memory_pointer,
  871.                 (unsigned) current_server -> current_mem_procs,
  872.                 sizeof (process_memory),
  873.                 process_mem_cmd_compare);
  874.  
  875.           break;
  876.  
  877.         }
  878.  
  879.       break;
  880.     }
  881.  
  882.       break;
  883.  
  884.     }
  885. /*
  886.   fprintf(stdout,"about to leave sort process\n");
  887. */
  888. }
  889.  
  890. /*+-------------------------------------------------------------------------
  891.     sort_procs(button_num)
  892. --------------------------------------------------------------------------*/
  893. void
  894. sort_procs (button_num)
  895.      int             button_num;
  896. {
  897.   int             iproc;
  898.   register char  *cptr;
  899.   register struct my_proc_struct *tproc;
  900.  
  901. /* if slot not in use, force to end when sorting */
  902.  
  903.   current_server -> nprocs = 0;
  904.   for (iproc = 0; iproc < current_server -> slots_in_use; iproc++)
  905.     {
  906.       tproc = current_server -> pprocs[iproc];
  907.       if (tproc -> p_stat == 0)  /* if slot not in use, ... */
  908.     {              /* eliminate from consideration */
  909.       tproc -> p_pid = 32767;    /* force below selected procs in
  910.                      * qsort */
  911.       continue;
  912.     }
  913.       current_server -> nprocs++;
  914.     }
  915.  
  916. /* sort new procs array */
  917.  
  918.   sort_processes (button_num);
  919.  
  920. }                /* end of sort_procs */
  921.  
  922. /*+-------------------------------------------------------------------------
  923.     get_old_user(tproc,tuser) - read user struct for pid
  924. return 1 if successful, else 0 if not available
  925. --------------------------------------------------------------------------*/
  926. int
  927. get_old_user (tproc, tuser)
  928.      struct my_proc_struct *tproc;
  929.      struct my_user_struct *tuser;
  930. {
  931.   int             i;
  932.   struct my_user_struct *start_my_user;
  933.  
  934.   if (current_server -> old_my_user != NULL)
  935.     {
  936.       start_my_user = current_server -> old_my_user;
  937.       for (i = 0; i < current_server -> old_slots_in_use; i++)
  938.     {
  939.       if (start_my_user -> p_pid == tproc -> p_pid)
  940.         {
  941.           tuser -> u_tsize = start_my_user -> u_tsize;
  942.           tuser -> u_dsize = start_my_user -> u_dsize;
  943.           tuser -> u_ssize = start_my_user -> u_ssize;
  944.           tuser -> u_utime = start_my_user -> u_utime;
  945.           tuser -> u_stime = start_my_user -> u_stime;
  946.           tuser -> u_ior = start_my_user -> u_ior;
  947.           tuser -> u_iow = start_my_user -> u_iow;
  948.           tuser -> u_iosw = start_my_user -> u_iosw;
  949.           tuser -> u_ioch = start_my_user -> u_ioch;
  950.  
  951.           strcpy (tuser -> u_psargs, start_my_user -> u_psargs);
  952.           strcpy (tuser -> u_comm, start_my_user -> u_comm);
  953.           return (1);
  954.         }
  955.       start_my_user++;
  956.  
  957.  
  958.     }
  959.     }
  960.  
  961.   return (0);
  962.  
  963. }                /* end of get_old_user */
  964.  
  965.  
  966. /*+-------------------------------------------------------------------------
  967.     get_user(tproc,tuser) - read user struct for pid
  968. return 1 if successful, else 0 if not available
  969. --------------------------------------------------------------------------*/
  970. int
  971. get_user (tproc, tuser)
  972.      struct my_proc_struct *tproc;
  973.      struct my_user_struct *tuser;
  974. {
  975.  
  976.   int             i;
  977.   struct my_user_struct *start_my_user;
  978.  
  979.  
  980.   start_my_user = current_server -> my_user;
  981.   for (i = 0; i < current_server -> slots_in_use; i++)
  982.     {
  983.       if (start_my_user -> p_pid == tproc -> p_pid)
  984.     {
  985.       tuser -> u_tsize = start_my_user -> u_tsize;
  986.       tuser -> u_dsize = start_my_user -> u_dsize;
  987.       tuser -> u_ssize = start_my_user -> u_ssize;
  988.       tuser -> u_utime = start_my_user -> u_utime;
  989.       tuser -> u_stime = start_my_user -> u_stime;
  990.       tuser -> u_ior = start_my_user -> u_ior;
  991.       tuser -> u_iow = start_my_user -> u_iow;
  992.       tuser -> u_iosw = start_my_user -> u_iosw;
  993.       tuser -> u_ioch = start_my_user -> u_ioch;
  994.  
  995.       strcpy (tuser -> u_psargs, start_my_user -> u_psargs);
  996.       strcpy (tuser -> u_comm, start_my_user -> u_comm);
  997.       return (1);
  998.     }
  999.       start_my_user++;
  1000.  
  1001.  
  1002.     }
  1003.   return (0);
  1004.  
  1005. }                /* end of get_user */
  1006.  
  1007.  
  1008. /*+-------------------------------------------------------------------------
  1009.     initialize_Ps()
  1010. --------------------------------------------------------------------------*/
  1011. void
  1012. initialize_Ps ()
  1013. {
  1014. #ifdef DEBUG1
  1015.   fprintf (stdout, "About to start initialize_Ps\n");
  1016. #endif
  1017.  
  1018. }                /* end of initialize_Ps */
  1019.  
  1020. /* vi: set tabstop=4 shiftwidth=4: */
  1021. /* end of ps.c */
  1022.